home *** CD-ROM | disk | FTP | other *** search
/ GFX Sensations 1 / Graphic Sensations - Volume 1.iso / tools / amiga / 3d_tools / irit40s.lha / Irit / cagd_lib / sbzreval.c < prev   
Encoding:
C/C++ Source or Header  |  1993-12-30  |  4.3 KB  |  140 lines

  1. /******************************************************************************
  2. * SBzrEval.c - Bezier surfaces handling routines - evaluation routines.          *
  3. *******************************************************************************
  4. * Written by Gershon Elber, Mar. 90.                          *
  5. ******************************************************************************/
  6.  
  7. #include "cagd_loc.h"
  8.  
  9. /******************************************************************************
  10. * Evaluate the given tensor product Bezier surface at a given point, by       *
  11. * extracting an isoparamteric curve along u and evaluating v in it.          *
  12. *                                          *
  13. *        u -->                                  *
  14. *     +----------------------+                              *
  15. *     |P0         Pi-1|                              *
  16. *   V |Pi        P2i-1|    Parametric space orientation - control mesh.  *
  17. *    ||                 |                              *
  18. *    v|Pn-i         Pn-1|                              *
  19. *     +----------------------+                              *
  20. *                                          *
  21. ******************************************************************************/
  22. CagdRType *BzrSrfEvalAtParam(CagdSrfStruct *Srf, CagdRType u, CagdRType v)
  23. {
  24.     CagdRType *Pt;
  25.     CagdCrvStruct
  26.     *IsoCrv = BzrSrfCrvFromSrf(Srf, u, CAGD_CONST_U_DIR);
  27.  
  28.     Pt = BzrCrvEvalAtParam(IsoCrv, v);
  29.  
  30.     CagdCrvFree(IsoCrv);
  31.  
  32.     return Pt;
  33. }
  34.  
  35. /******************************************************************************
  36. * Extract an isoline curve out of the given tensor product Bezier surface.    *
  37. * Operations should prefer the CONST_U_DIR, in which the extraction is          *
  38. * somewhat faster if it is possible.                          *
  39. ******************************************************************************/
  40. CagdCrvStruct *BzrSrfCrvFromSrf(CagdSrfStruct *Srf, CagdRType t,
  41.                             CagdSrfDirType Dir)
  42. {
  43.     CagdCrvStruct
  44.     *Crv = NULL;
  45.     CagdBType
  46.     IsNotRational = !CAGD_IS_RATIONAL_SRF(Srf);
  47.     int i, j, CrvOrder, VecLen,
  48.     MaxCoord = CAGD_NUM_OF_PT_COORD(Srf -> PType);
  49.     CagdRType *CrvP, *SrfP;
  50.  
  51.     switch (Dir) {
  52.     case CAGD_CONST_U_DIR:
  53.         Crv = BzrCrvNew(CrvOrder = Srf -> VLength, Srf -> PType);
  54.         VecLen = Srf -> ULength;
  55.  
  56.         for (i = IsNotRational; i <= MaxCoord; i++) {
  57.         CrvP = Crv -> Points[i];
  58.         SrfP = Srf -> Points[i];
  59.         for (j = 0; j < CrvOrder; j++) {
  60.             *CrvP++ = BzrCrvEvalVecAtParam(SrfP, CAGD_NEXT_U(Srf),
  61.                                 VecLen, t);
  62.             SrfP += CAGD_NEXT_V(Srf);
  63.         }
  64.         }
  65.         break;
  66.     case CAGD_CONST_V_DIR:
  67.         Crv = BzrCrvNew(CrvOrder = Srf -> ULength, Srf -> PType);
  68.         VecLen = Srf -> VLength;
  69.  
  70.         for (i = IsNotRational; i <= MaxCoord; i++) {
  71.         CrvP = Crv -> Points[i];
  72.         SrfP = Srf -> Points[i];
  73.         for (j = 0; j < CrvOrder; j++) {
  74.             *CrvP++ = BzrCrvEvalVecAtParam(SrfP, CAGD_NEXT_V(Srf),
  75.                                 VecLen, t);
  76.             SrfP += CAGD_NEXT_U(Srf);
  77.         }
  78.         }
  79.         break;
  80.     default:
  81.         FATAL_ERROR(CAGD_ERR_DIR_NOT_CONST_UV);
  82.         break;
  83.     }
  84.     return Crv;
  85. }
  86.  
  87. /******************************************************************************
  88. * Extract an isoline curve out of the given mesh row/col.              *
  89. * The provided (zero based) Index specifies which row/col Index to extract.   *
  90. ******************************************************************************/
  91. CagdCrvStruct *BzrSrfCrvFromMesh(CagdSrfStruct *Srf, int Index,
  92.                             CagdSrfDirType Dir)
  93. {
  94.     CagdCrvStruct
  95.     *Crv = NULL;
  96.     CagdBType
  97.     IsNotRational = !CAGD_IS_RATIONAL_SRF(Srf);
  98.     int i, j, CrvOrder,
  99.     MaxCoord = CAGD_NUM_OF_PT_COORD(Srf -> PType);
  100.     CagdRType *CrvP, *SrfP;
  101.  
  102.     switch (Dir) {
  103.     case CAGD_CONST_U_DIR:
  104.         if (Index + 1 > Srf -> ULength)
  105.         FATAL_ERROR(CAGD_ERR_INDEX_NOT_IN_MESH);
  106.  
  107.         Crv = BzrCrvNew(CrvOrder = Srf -> VLength, Srf -> PType);
  108.  
  109.         for (i = IsNotRational; i <= MaxCoord; i++) {
  110.         CrvP = Crv -> Points[i];
  111.         SrfP = Srf -> Points[i] + Index * CAGD_NEXT_U(Srf);
  112.         for (j = 0; j < CrvOrder; j++) {
  113.             *CrvP++ = *SrfP;
  114.             SrfP += CAGD_NEXT_V(Srf);
  115.         }
  116.         }
  117.         break;
  118.     case CAGD_CONST_V_DIR:
  119.         if (Index + 1 > Srf -> VLength)
  120.         FATAL_ERROR(CAGD_ERR_INDEX_NOT_IN_MESH);
  121.  
  122.         Crv = BzrCrvNew(CrvOrder = Srf -> ULength, Srf -> PType);
  123.  
  124.         for (i = IsNotRational; i <= MaxCoord; i++) {
  125.         CrvP = Crv -> Points[i];
  126.         SrfP = Srf -> Points[i] + Index * CAGD_NEXT_V(Srf);;
  127.         for (j = 0; j < CrvOrder; j++) {
  128.             *CrvP++ = *SrfP;
  129.             SrfP += CAGD_NEXT_U(Srf);
  130.         }
  131.         }
  132.         break;
  133.     default:
  134.         FATAL_ERROR(CAGD_ERR_DIR_NOT_CONST_UV);
  135.         break;
  136.     }
  137.     return Crv;
  138. }
  139.  
  140.